package cn.edu.zxj.springblog.controller;

import cn.edu.zxj.springblog.model.Result;
import cn.edu.zxj.springblog.model.UserInfo;
import cn.edu.zxj.springblog.service.UserInfoService;
import cn.edu.zxj.springblog.utils.JWTUtils;
import cn.edu.zxj.springblog.utils.SecurityUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpRequest;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

/**
 * Created with IntelliJ IDEA.
 * Description：
 *
 * @author: zxj
 * @date: 2024-02-04
 * @time: 20:15:48
 */
@RestController
@Slf4j
@RequestMapping("/user")
public class UserInfoController {
    @Autowired
    private UserInfoService userInfoService;

    @RequestMapping("/login")
    public Result login(String username, String password) {
        log.info("接收到用户登录请求, username: {}", username);

        // 1. 参数合法校验
        if (!StringUtils.hasLength(username)
                || !StringUtils.hasLength(password)) {
            return Result.fail("参数存在问题");
        }

        // 2. 判断是否正确
        // 2.1 调用数据库查询用户信息
        UserInfo userInfo = userInfoService.selectByUsername(username);
        // 2.2 判断密码是否正确
        if (userInfo == null || !SecurityUtil.verify(password,userInfo.getPassword())) {
            return Result.fail("用户或者密码错误");
        }

        // 3. 生成 token 并返回给前端
        // 3.1 提取 userInfo 中的相关信息, 存储到 token 中
        Map<String, Object> claim = new HashMap<>();
        claim.put("id", userInfo.getId());
        claim.put("userName", userInfo.getUserName());
        // 3.2 利用 claim 存储到 token 中
        String token = JWTUtils.genJWT(claim);

        log.info("依据 claim: {}, 生成 token: {}", claim, token);

        return Result.success(token);
    }

    @RequestMapping("/getUserInfo")
    public Result getUserInfo(HttpServletRequest request) {
        log.info("收到获取用户登录信息请求...");

        // 1. 提取token中的用户ID
        String token = request.getHeader("user_token");
        Integer id = JWTUtils.getUserIdFromToken(token);
        if (id == null || id < 1) {
            return Result.fail("用户登录状态异常");
        }

        // 2. 业务处理
        UserInfo userInfo = userInfoService.selectById(id);

        if (userInfo == null) {
            return Result.fail("用户查询异常");
        }

        return Result.success(userInfo);
    }

    /**
     * @description: 依据博客id 查询 博客信息中的作者 user_id -> 作者信息
     **/
    @RequestMapping("/getAuthorInfo")
    public Result getAuthorInfo(Integer blogId) {
        log.info("接收到查询博客作者信息请求, blogId", blogId);

        if (blogId == null || blogId < 1) {
            return Result.fail("参数存在问题");
        }

        UserInfo userInfo = userInfoService.getAuthorInfo(blogId);

        if (userInfo == null || userInfo.getId() < 1) {
            return Result.fail("查询用户信息失败");
        }

        return Result.success(userInfo);
    }

}
